/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.losalpes.marketplace.pirfq.beans;

import co.com.losalpes.marketplace.pirfq.bos.CotizacionBO;
import co.com.losalpes.marketplace.pirfq.bos.FabricanteBO;
import co.com.losalpes.marketplace.pirfq.bos.FabricanteCotizacionBO;
import co.com.losalpes.marketplace.pirfq.entities.Cotizacion;
import co.com.losalpes.marketplace.pirfq.entities.FabricanteCotizacion;
import co.com.losalpes.marketplace.pirfq.entities.FabricanteCotizacionId;
import co.com.losalpes.marketplace.pirfq.entities.persistence.Persistence;
import co.com.losalpes.marketplace.pirfq.exceptions.CotizacionNoExisteException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Query;

/**
 *
 * @author leon
 */
public class RFQBeanServer {

    public static final String ABIERTAS_COTIZACION = "A";

    /**
     * Se establece el estado de la cotización en RADICADO
     *
     * @param cotizacionBO sin el numero
     * @return numero de la cotizacion
     */
    public String crearCotizacion(CotizacionBO cotizacionBO) {

        String numero = "RFQ" + System.currentTimeMillis();

        cotizacionBO.setNumero(numero);
        Cotizacion cotizacion = new Cotizacion(cotizacionBO);
        this.getEm().persist(cotizacion);

        return numero;
    }

    public boolean asignarFabricanteACotizacion(String numeroCotizacion, FabricanteBO fabricante) throws CotizacionNoExisteException {

        //buscar x numero cotizacion
        System.out.println(numeroCotizacion);
        Query quer = this.getEm().createNamedQuery("getCotizacionPorNumero");
        quer.setParameter("numero", numeroCotizacion);
        List<Cotizacion> listCotizaciones = quer.getResultList();
        Cotizacion cot = null;
        if (listCotizaciones.isEmpty()) {
            throw new CotizacionNoExisteException("El numero de cotizacion ingresado no existe");
        } else {
            cot = listCotizaciones.get(0);
        }
        Long ideCotizacion = cot.getId();
        FabricanteCotizacionBO fabricanteCotizacionBo = new FabricanteCotizacionBO();
        fabricanteCotizacionBo.setId_cotizacion(ideCotizacion);
        fabricanteCotizacionBo.setNit_fabricante(fabricante.getNit());
        fabricanteCotizacionBo.setEstado("A");
        FabricanteCotizacion fabricanteCotizacion = this.getEm().find(FabricanteCotizacion.class, new FabricanteCotizacionId(ideCotizacion, fabricante.getNit()));
        if (fabricanteCotizacion == null) {
            fabricanteCotizacion = new FabricanteCotizacion(fabricanteCotizacionBo);
            this.getEm().persist(fabricanteCotizacion);
        }
        return true;

    }

    /**
     *
     * @param cotizacion
     * @param fabricantes
     * @return
     */
    public boolean asignarFabricantesACotizacion(String numeroCotizacion, List<FabricanteBO> fabricantes) throws CotizacionNoExisteException {
        CotizacionBO cot = buscarCotizacionPorNumero(numeroCotizacion);
        Long ideCotizacion = cot.getId();
        for (FabricanteBO fabricante : fabricantes) {
            FabricanteCotizacionBO fabricanteCotizacionBo = new FabricanteCotizacionBO();
            fabricanteCotizacionBo.setId_cotizacion(ideCotizacion);
            fabricanteCotizacionBo.setNit_fabricante(fabricante.getNit());
            fabricanteCotizacionBo.setEstado("A");
            FabricanteCotizacion fabricanteCotizacion = this.getEm().find(FabricanteCotizacion.class, new FabricanteCotizacionId(ideCotizacion, fabricante.getNit()));
            if (fabricanteCotizacion == null) {
                fabricanteCotizacion = new FabricanteCotizacion(fabricanteCotizacionBo);
                this.getEm().persist(fabricanteCotizacion);
            }
        }

        return true;
    }

    public CotizacionBO buscarCotizacionPorNumero(String numeroCotizacion) {
        //buscar x numero cotizacion
        Query quer = this.getEm().createNamedQuery("getCotizacionPorNumero");
        quer.setParameter("numero", numeroCotizacion);
        List<Cotizacion> listCotizaciones = quer.getResultList();
        if (!listCotizaciones.isEmpty()) {
            return listCotizaciones.get(0).toBO();
        }
        return null;
    }

    /**
     * Permite obtener cotizaciones ofertadas por un fabricante
     *
     * @param idFabricante
     * @param estadoimport javax.persistence.EntityManager; import
     * javax.persistence.EntityManagerFactory;
     * @return
     */
    public List<CotizacionBO> obtenerCotizacionesPorFabricante(Long idFabricante, String estado) {

        //quemado Prueba
        //List<CotizacionBO> list = new ArrayList<CotizacionBO>();
        //fin
        Query q = this.getEm().createNamedQuery("obtenerCotizacionesFabricanteEstado");
        q.setParameter("id_fabricante", idFabricante.toString()); //TO STRING
        q.setParameter("estado", estado);
        List<FabricanteCotizacion> fabricantesCotizaciones = (List<FabricanteCotizacion>) q.getResultList();
        List<CotizacionBO> listCotizacionBO = new ArrayList<CotizacionBO>();
        if (fabricantesCotizaciones != null && !fabricantesCotizaciones.isEmpty()) {
            for (FabricanteCotizacion fabCotizac : fabricantesCotizaciones) {

                Long idCotizacion = fabCotizac.getId_cotizacion();

                Query queryCotizacion = this.getEm().createNamedQuery("getCotizacionByID");
                queryCotizacion.setParameter("id", idCotizacion);

                List<Cotizacion> cotizaciones = (List<Cotizacion>) queryCotizacion.getResultList();

                if (cotizaciones != null && !cotizaciones.isEmpty()) {
                    CotizacionBO cotizacionBO = cotizaciones.get(0).toBO();

                    if (cotizacionBO != null) {
                        listCotizacionBO.add(cotizacionBO);
                    }
                }


            }
        }

        //descomente para test
        //list.add(new CotizacionBO(10, 200000, null, null, 9, "Yogurt", "Lacteos"));

        return listCotizacionBO;
    }

    /**
     * Permite obtener las cotizaciones establecidas por el comercio
     *
     * @param idComercio
     * @param estado
     * @return
     */
    public List<CotizacionBO> obtenerCotizacionesPorComercio(Long idComercio, String estado) {

        Query q = this.getEm().createNamedQuery("getCotizacionComercioEstado");
        q.setParameter("id", idComercio.toString());
        q.setParameter("estado", estado);

        List<Cotizacion> cotizaciones = (List<Cotizacion>) q.getResultList();
        List<CotizacionBO> listCotizacionBO = new ArrayList<CotizacionBO>();

        if (cotizaciones != null && !cotizaciones.isEmpty()) {
            for (Cotizacion cotizacionEntity : cotizaciones) {
                CotizacionBO cotizacionBO = cotizacionEntity.toBO();
                if (cotizacionBO != null) {
                    listCotizacionBO.add(cotizacionBO);
                }
            }
        }

        return listCotizacionBO;
    }

    /**
     *
     * @param fabricanteCotizacionBo
     * @return
     */
    public Boolean ofertarCotizacion(FabricanteCotizacionBO fabricanteCotizacionBo) {
        FabricanteCotizacion ofertar = new FabricanteCotizacion(fabricanteCotizacionBo);
        ofertar.setEstado("RESPONDIDA");
        this.getEm().merge(ofertar);
        return true;
    }

    public Boolean actualizarEstadoCotizacion(String numeroCotizacion, String estado) throws CotizacionNoExisteException {
        //buscar x numero cotizacion
        Query quer = this.getEm().createNamedQuery("getCotizacionPorNumero");
        quer.setParameter("numero", numeroCotizacion);
        List<Cotizacion> listCotizaciones = quer.getResultList();
        Cotizacion cot = null;
        if (listCotizaciones.isEmpty()) {
            throw new CotizacionNoExisteException("El numero de cotizacion a actualizar no existe");
        } else {
            cot = listCotizaciones.get(0);
        }
        cot = this.getEm().find(Cotizacion.class, cot.getId());
        cot.setEstado(estado);
        this.getEm().merge(cot);
        return true;
    }

    public List<FabricanteCotizacionBO> obtenerOfertasFabricantes(String numeroCotizacion) {
        List<FabricanteCotizacionBO> list = new ArrayList<FabricanteCotizacionBO>();
        //buscar x numero cotizacion
        Query quer = this.getEm().createNamedQuery("getCotizacionPorNumero");
        quer.setParameter("numero", numeroCotizacion);
        List<Cotizacion> listCotizaciones = quer.getResultList();
        Cotizacion cot = null;
        if (listCotizaciones.isEmpty()) {
            //Excepcion no declarada en la interfaz local
            //throws CotizacionNoExisteException
            //throw new CotizacionNoExisteException("El numero de cotizacion ingresado no existe");
        } else {
            cot = listCotizaciones.get(0);
        }
        if (cot != null) {
            List<FabricanteCotizacion> ofertas = new ArrayList<FabricanteCotizacion>(0);
            Long idCotizacion = cot.getId();
            Query consOfertas = this.getEm().createNamedQuery("getOfertaFabricante");
            consOfertas.setParameter("idCotizacion", idCotizacion);
            ofertas = consOfertas.getResultList();
            if (ofertas != null && !ofertas.isEmpty()) {
                for (FabricanteCotizacion fabCotizacion : ofertas) {
                    FabricanteCotizacionBO item = fabCotizacion.toBO();
                    Cotizacion cotActual = getEm().find(Cotizacion.class, item.getId_cotizacion());
                    item.setCotizacion(cotActual.toBO());
                    list.add(item);
                }
            }
        }
        return list;
    }

    /**
     * Asigna el fabricante ganador, y cierra la cotización
     *
     * @param numeroCotizacion
     * @param idFabricante
     * @return
     */
    public Boolean asignarCotizacionGanadora(String numeroCotizacion, String idFabricante) {
        //buscar x numero cotizacion
        Query quer = this.getEm().createNamedQuery("getCotizacionPorNumero");
        quer.setParameter("numero", numeroCotizacion);
        List<Cotizacion> listCotizaciones = quer.getResultList();
        Cotizacion cot = null;
        if (listCotizaciones.isEmpty()) {
            //throw new CotizacionNoExisteException("El numero de cotizacion ingresado no existe");
            return false;
        } else {
            cot = listCotizaciones.get(0);
            cot.setNit_fabricante_seleccionado(idFabricante);
            cot.setEstado("GANADA");
            this.getEm().merge(cot);
            return true;
        }
    }

    private Persistence getEm() {
        Persistence persistence = new Persistence();
        return persistence;
    }
}
